package cn.tedu.dimanage.message.webapi.service;

import cn.tedu.dimanage.common.ex.ServiceException;
import cn.tedu.dimanage.common.web.State;
import cn.tedu.dimanage.message.service.IMessageService;
import cn.tedu.dimanage.message.webapi.mapper.MessageMapper;
import cn.tedu.dimanage.pojo.dto.MessageDTO;
import cn.tedu.dimanage.pojo.entity.Message;
import cn.tedu.dimanage.pojo.vo.MessageVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.List;

@Service
@Slf4j
public class MessageServiceImpl implements IMessageService {
    //顶级父类的parent_id
   private static final Long PARENT_ID = 0L;

    @Autowired
    private MessageMapper mapper;

    //这是一个创建评论的实现方法
    @Override
    public int addMessageParent(MessageDTO messageDTO) {
        Message message = new Message();
        //把用户传来的数据给message
        BeanUtils.copyProperties(messageDTO,message);
        //创建出来的评论都为顶级父类
        message.setParentId(PARENT_ID);
        message.setGmtCreate(LocalDateTime.now());

        int rows = mapper.insert(message);
        if (rows != 1){
            throw new ServiceException(State.ERR_INSERT,"创建父级评论失败,请稍后再试");
        }
        return rows;
    }

    //添加子集留言评论
    @Override
    public int addMessageSubset(MessageDTO messageDTO) {
        Message message = new Message();
        //把用户传来的数据给message
        BeanUtils.copyProperties(messageDTO,message);
        //创建出来的评论都为顶级父类
        message.setGmtCreate(LocalDateTime.now());
        int row = mapper.insert(message);
        if (row != 1){
            throw new ServiceException(State.ERR_INSERT,"创建子集评论失败,请稍后再试");
        }
        return row;

    }


    //删除一个顶级父类评论
    //这是一个删除顶级父类以及顶级父类所有下级的递归方法
    @Override
    public void deleteMessage(Long id) {
        int row = mapper.delete(id);
        if (row != 1){
            throw new ServiceException(State.ERR_INSERT,"创建子集评论失败,请稍后再试");
        }
        deleteParentAndSubset(id);
    }


    //通过父级的id 查询该父级下的所有子集对象
    @Override
        public List<MessageVO> selectSubsetList(Long id) {
        //得到子集集合
        List<MessageVO> subsetList = mapper.selectPrentId(id);
        return subsetList;
    }

    //查询所有父级评论数据
    @Override
    public List<MessageVO> selectList() {
        //查到 顶级父类评论的集合
        List<MessageVO> messagePrentVOs = mapper.selectPrentId(PARENT_ID);
        return messagePrentVOs;
    }


    public void deleteParentAndSubset(Long id) {

        //看这个id对应的评论下有没有子评论  自身id = 子评论的PrentId
        List<MessageVO> messageVOList = mapper.selectPrentId(id);

        //  查询下面有没有子集
        if (messageVOList.size() != 0) {
            log.info("有下级,开始递归删除");
            //进入该方法说明有子评论
            for (MessageVO messageVO : messageVOList) {
                //遍历出来所有子评论id
                Long SubsetId = messageVO.getId();
                //进行删除
                mapper.delete(SubsetId);
                //再来一次
                deleteParentAndSubset(SubsetId);
            }
        }
    }









}
